/*!
 * iOS SDK
 *
 * Tencent is pleased to support the open source community by making
 * Hippy available.
 *
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#import "HippyView+HippyViewAnimation.h"
#import "HippyExtAnimation.h"
#import "HippyConvert.h"

@implementation HippyView (HippyViewAnimation)

- (CAAnimation *)animation:(HippyExtAnimation *)animation keyPath:(NSString *)keyPath {
    if ([keyPath isEqualToString:@"backgroundColor"]) {
        __block id fromValue = nil;
        __block id toValue = nil;
        UIColor *fromColor = [HippyConvert UIColor:@(animation.startValue)];
        UIColor *toColor = [HippyConvert UIColor:@(animation.endValue)];
        if (self.layer.contents) {
            BOOL sync = [self getLayerContentForColor:toColor completionBlock:^(UIImage *image) {
                toValue = (id)image.CGImage;
            }];
            if (sync && toValue) {
                keyPath = @"contents";
            }
            else {
                return nil;
            }
        }
        else {
            toValue = (id)toColor.CGColor;
            fromValue = (id)fromColor.CGColor;
        }
        CABasicAnimation *ani = [CABasicAnimation animationWithKeyPath:keyPath];
        ani.duration = animation.duration;
        if (fabs(animation.delay) > CGFLOAT_MIN) {
            ani.beginTime = CACurrentMediaTime() + animation.delay;
        }
        ani.timingFunction = animation.timingFunction;
        ani.repeatCount = animation.repeatCount;
        ani.removedOnCompletion = NO;
        ani.fillMode = kCAFillModeForwards;
        ani.toValue = toValue;
        ani.fromValue = fromValue;
        return ani;
    }
    return nil;
}

@end
